﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace V82.ОбщиеМодули
{
	public partial class ЭлектроннаяЦифроваяПодписьКлиент
	{
		////////////////////////////////////////////////////////////////////////////////
		//  ПРОГРАММНЫЙ ИНТЕРФЕЙС ДЛЯ РАБОТЫ С ПОДПИСЯМИ
		// Формирует данные подписи объекта
		//
		// Параметры
		//  МенеджерКриптографии  - МенеджерКриптографии - менеджер криптографии
		//  ОбъектДляПодписиСсылка  - любая ссылка - ссылка на подписываемый объект
		//  ДвоичныеДанные  - ДвоичныеДанные - двоичные данные подписи
		//  СтруктураПараметровПодписи  - Структура - информация о подписи - выбранный сертификат, пароль, комментарий
		//
		// Возвращаемое значение:
		//   Структура   - данные для занесения в табличную часть ЭЦП

		public object СформироватьДанныеПодписи(/*
			МенеджерКриптографии,
			ОбъектДляПодписиСсылка,
			ДвоичныеДанные,
			СтруктураПараметровПодписи*/)
		{
			//МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СтруктураПараметровПодписи.Пароль;
			//ДатаПодписи = ТекущаяДата();
			//НоваяПодписьДвоичныеДанные = МенеджерКриптографии.Подписать(ДвоичныеДанные, СтруктураПараметровПодписи.Сертификат);
			//Отпечаток = Base64Строка(СтруктураПараметровПодписи.Сертификат.Отпечаток);
			//КомуВыданСертификат = ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(СтруктураПараметровПодписи.Сертификат.Субъект);
			//ДвоичныеДанныеСертификата = СтруктураПараметровПодписи.Сертификат.Выгрузить();
			/*// ИмяФайлаПодписи
*/
			/*// АдресФайла
*/
			//ДвоичныеДанныеСертификата);
			return null;
		}
		// Проверяет подпись. В случае ошибки бросает исключение
		//
		// Параметры
		//  МенеджерКриптографии  - МенеджерКриптографии - менеджер криптографии
		//  ДвоичныеДанныеФайла  -    двоичные данные файла
		//  ДвоичныеДанныеПодписи  -  двоичные данные подписи

		public void ПроверитьПодпись(/*МенеджерКриптографии, ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи*/)
		{
			//Сертификат = Неопределено;
			//МенеджерКриптографии.ПроверитьПодпись(ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи, Сертификат);
			//МассивРежимовПроверки = Новый Массив;
			//МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.ИгнорироватьВремяДействия);
			//МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты);
			//МенеджерКриптографии.ПроверитьСертификат(Сертификат, МассивРежимовПроверки);
		}
		////////////////////////////////////////////////////////////////////////////////
		//  ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ДЛЯ РАБОТЫ С ЭЦП
		// Находит сертификат по строке отпечатка
		//
		// Параметры
		//  Отпечаток  - Строка - base64 кодированный отпечаток сертификата
		//  ТолькоВЛичномХранилище  - Булево - вести поиск только в личном хранилище
		//
		// Возвращаемое значение:
		//   СертификатКриптографии  - сертификат криптографии

		public object ПолучитьСертификатПоОтпечатку(/*Отпечаток, ТолькоВЛичномХранилище = Ложь*/)
		{
			//ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток);
			//Отказ = Ложь;
			//МенеджерКриптографии = ПолучитьМенеджерКриптографии(Отказ);
			if(true/*Отказ*/)
			{
			}
			//ХранилищеСертификатов = Неопределено;
			if(true/*ТолькоВЛичномХранилище*/)
			{
				//ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
			}
			//Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка);
			return null;
		}
		// Заполняет структуру полями сертификата
		//
		// Параметры
		//  Отпечаток  - Строка - base64 кодированный отпечаток сертификата
		//
		// Возвращаемое значение:
		//   Структура  - структура с полями сертификата

		public object ЗаполнитьСтруктуруСертификатаПоОтпечатку(/*Отпечаток*/)
		{
			//ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток);
			//Отказ = Ложь;
			//МенеджерКриптографии = ПолучитьМенеджерКриптографии(Отказ);
			if(true/*Отказ*/)
			{
			}
			//ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов();
			//Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка);
			if(true/*Сертификат = Неопределено*/)
			{
				//Предупреждение(НСтр("ru = 'Сертификат не найден'"));
			}
			return null;
		}
		//  Получает массив структур сертификатов для показа в диалоге выбора сертификатов для подписи или шифрования
		//
		// Параметры
		//  ТолькоЛичные  - Булево - если Ложь, то берутся также и сертификаты получателей
		//
		// Возвращаемое значение:
		//   Массив  - массив структур с полями сертификата

		public object ПолучитьМассивСтруктурСертификатов(/*знач ТолькоЛичные*/)
		{
			//МассивСтруктурСертификатов = Новый Массив;
			//Отказ = Ложь;
			//МенеджерКриптографии = ПолучитьМенеджерКриптографии(Отказ);
			if(true/*Отказ*/)
			{
			}
			//ТекущаяДата = ТекущаяДата();
			/*// для подписи
*/
			//Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
			//СертификатыХранилища = Хранилище.ПолучитьВсе();
			//МассивСтрокОтпечатков = Новый Массив;
			if(true/*НЕ ТолькоЛичные*/)
			{
				//Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.СертификатыПолучателей);
				//СертификатыХранилища = Хранилище.ПолучитьВсе();
			}
			return null;
		}
		// Создает на клиенте менеджер криптографии.  Пароль не устанавливается
		//
		// Возвращаемое значение:
		//   МенеджерКриптографии  - менеджер криптографии

		public object ПолучитьМенеджерКриптографии(/*Отказ = Ложь*/)
		{
			//Отказ = Ложь;
			if(true/*НЕ ПодключитьРасширениеРаботыСКриптографией()*/)
			{
				//Отказ = Истина;
			}
			//ПровайдерЭЦП = ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПровайдерЭЦП;
			//ПутьМодуляКриптографии = ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПутьМодуляКриптографии;
			//ТипПровайдераЭЦП = ПолучитьПерсональныеНастройкиРаботыСЭЦП().ТипПровайдераЭЦП;
			//МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП);
			//МенеджерКриптографии.АлгоритмПодписи = ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмПодписи;
			//МенеджерКриптографии.АлгоритмХеширования = ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмХеширования;
			//МенеджерКриптографии.АлгоритмШифрования = ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмШифрования;
			return null;
		}
		// Открывает форму просмотра сертификата ЭЦП
		//
		// Параметры
		//  Отпечаток  - Строка - отпечаток сертификата ЭЦП
		//

		public void ОткрытьСертификат(/*Отпечаток*/)
		{
			if(true/*ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS()*/)
			{
			}
			//СтруктураСертификата = ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток);
			if(true/*СтруктураСертификата <> Неопределено*/)
			{
				//ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, Отпечаток);
				//СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы);
			}
		}
		// Открывает форму просмотра сертификата ЭЦП
		//
		// Параметры
		//  СтруктураСертификата - Структура с полями сертификата
		//  Отпечаток  - Строка - отпечаток сертификата ЭЦП
		//  АдресСертификата - Строка - адрес сертификата во временном хранилище
		//

		public void ОткрытьСертификатСоСтруктурой(/*СтруктураСертификата, Отпечаток, АдресСертификата*/)
		{
			if(true/*ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS()*/)
			{
			}
			if(true/*СтруктураСертификата <> Неопределено*/)
			{
				/*ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток, АдресСертификата", 
			СтруктураСертификата, Отпечаток, АдресСертификата);*/
				//ОткрытьФормуМодально("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы);
			}
		}
		// Возвращает структуру, содержащую различные персональные настройки

		public object ПолучитьПерсональныеНастройкиРаботыСЭЦП(/**/)
		{
			return null;
		}
		// Открывает форму просмотра сертификата ЭЦП

		public void ОткрытьСертификатПоОтпечаткуИАдресу(/*Отпечаток, АдресСертификата*/)
		{
			if(true/*ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS()*/)
			{
			}
			//РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами();
			//Отпечаток = Отпечаток;
			//Сертификат = Неопределено;
			//СтруктураСертификата = Неопределено;
			if(true/*НЕ ПустаяСтрока(АдресСертификата)*/)
			{
				//ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата);
				//Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата);
				//СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат);
			}
			if(true/*СтруктураСертификата <> Неопределено*/)
			{
				//ОткрытьСертификатСоСтруктурой(СтруктураСертификата, Отпечаток, АдресСертификата);
			}
		}
		// Открывает форму просмотра подписи ЭЦП

		public void ОткрытьПодпись(/*ТекущиеДанные*/)
		{
			if(true/*ТекущиеДанные = Неопределено*/)
			{
			}
			if(true/*ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS()*/)
			{
			}
			//РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами();
			if(true/*ТекущиеДанные.Объект <> Неопределено И (НЕ ТекущиеДанные.Объект.Пустая())*/)
			{
				//Отпечаток = ТекущиеДанные.Отпечаток;
				//Сертификат = Неопределено;
				//СтруктураСертификата = Неопределено;
				if(true/*НЕ ПустаяСтрока(ТекущиеДанные.АдресСертификата)*/)
				{
					//ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(ТекущиеДанные.АдресСертификата);
					//Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата);
					//СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат);
				}
				if(true/*СтруктураСертификата <> Неопределено*/)
				{
					/*ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток, АдресСертификата, УстановившийПодпись, Комментарий, АдресПодписи, ДатаПодписи", 
				СтруктураСертификата, Отпечаток, ТекущиеДанные.АдресСертификата,
				ТекущиеДанные.УстановившийПодпись, ТекущиеДанные.Комментарий, ТекущиеДанные.АдресПодписи,
				ТекущиеДанные.ДатаПодписи);*/
					//ОткрытьФормуМодально("ОбщаяФорма.ПодписьЭЦП", ПараметрыФормы);
				}
			}
		}
		// "Сохранить как" вместе с подписями - все или выбранные
		//
		// Параметры
		//  ФайлСсылка  - СправочникСсылка - объект, в табличной части которого содержатся подписи
		//  ПолноеИмяФайла - Строка - полное имя с путем, под которым сохранен файл
		//  УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы
		//  МассивСтруктурПодписей - Массив  - массив структур подписей. Если Неопределено - сохраняем все подписи
		//

		public void СохранитьПодписи(/*ФайлСсылка, ПолноеИмяФайла, УникальныйИдентификатор, МассивСтруктурПодписей*/)
		{
			//ОсновнойФайл = Новый Файл(ПолноеИмяФайла);
			//Путь = ОсновнойФайл.Путь;
			//МассивИмен = Новый Массив;
			//МассивИмен.Добавить(ОсновнойФайл.Имя);
			//РасширениеДляФайловПодписи = ПолучитьПерсональныеНастройкиРаботыСЭЦП().РасширениеДляФайловПодписи;
			if(true/*МассивСтруктурПодписей.Количество() <> 0*/)
			{
				//Текст = НСтр("ru = 'Каталог:'") + Символы.ПС;
				//Текст = Текст + Путь;
				//Текст = Текст + Символы.ПС + Символы.ПС;
				//Текст = Текст + НСтр("ru = 'Файлы:'") + Символы.ПС;
				//ПараметрыФормы = Новый Структура("Текст", Текст);
				//ОткрытьФорму("ОбщаяФорма.ОтчетОСохраненииФайлов", ПараметрыФормы);
			}
		}
		// Сохраняет подпись на диск

		public void СохранитьПодпись(/*АдресПодписи*/)
		{
			if(true/*НЕ ПодключитьРасширениеРаботыСФайлами()*/)
			{
			}
			//РасширениеДляФайловПодписи = ПолучитьПерсональныеНастройкиРаботыСЭЦП().РасширениеДляФайловПодписи;
			//ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
			/*Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Все файлы (*.%1)|*.%1'"), РасширениеДляФайловПодписи, РасширениеДляФайловПодписи);*/
			//ДиалогОткрытияФайла.Фильтр = Фильтр;
			//ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
			//ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл для сохранения подписи'");
			if(true/*ДиалогОткрытияФайла.Выбрать()*/)
			{
				//ПолныйПутьПодписи = ДиалогОткрытияФайла.ПолноеИмяФайла;
				//Файл = Новый Файл(ПолныйПутьПодписи);
				//ПередаваемыеФайлы = Новый Массив;
				//Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьПодписи, АдресПодписи);
				//ПередаваемыеФайлы.Добавить(Описание);
				//ПутьКФайлу = Файл.Путь;
				if(true/*Прав(ПутьКФайлу,1) <> "\"*/)
				{
					//ПутьКФайлу = ПутьКФайлу + "\";
				}
				/*// Сохраним Файл из БД на диск
*/
				//ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь);
				/*Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Подпись сохранена в файл ""%1""'"),
			ДиалогОткрытияФайла.ПолноеИмяФайла);*/
				//Состояние(Текст);
			}
		}
		// Процедура предназначена для коррекции имени файла  - замена некорректных символов на пробел
		//
		// Параметры
		//  СтрИмяФайла  - Строка - Имя файла

		public void СкорректироватьИмяФайла(/*СтрИмяФайла*/)
		{
			/*// Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru.
*/
			/*// При этом были объединены запрещенные символы для файловых систем FAT и NTFS.
*/
			//СтрИсключения = """ / \ [ ] : ; | = , ? * < >";
			//СтрИсключения = СтрЗаменить(СтрИсключения, " ", "");
			//СтрИмяФайла = СокрЛП(СтрИмяФайла);
		}
		// СкорректироватьИмяФайла()
	}
}
